On considère une expérience aléatoire d'univers $\Omega$ et $P$ une probabilité sur $\Omega$.
Loi des grands Nombres
Soit $A$ un événement. On répète un très grand nombre de fois et de manière indépendante l'expérience aléatoire et on note $f$ la fréquence à laquelle $A$ est réalisé (c'est-à -dire la fréquence à laquelle l'issue de l'expérience est dans $A$). Quand le nombre d'expériences indépendantes tend vers $+\infty$ (c'est-à -dire devient de plus en plus grand) la fréquence $f$ tend vers $P(A)$.
Le terme méthode de Monte-Carlo désigne une famille de méthodes algorithmiques visant à calculer une valeur numérique approchée en utilisant des techniques probabilistes. Elles sont particulièrement utilisées pour calculer des surfaces.
Principe de la méthode de Monte-Carlo
On considère une fonction $f: [a,b]\rightarrow\mathbb{R}$ et on souhaite déterminer numériquement une valeur approchée de l'aire $\mathcal{A}_f$ de la partie située sous la courbe représentative de $f$. Pour cela, on considère un rectangle de côté $[a,b]\times [0,M]$ contenant toute la portion de courbe comme sur la figure ci-dessous :
On tire successivement et de manière indépendante des points au hasard dans ce rectangle et on note $A$ l'événement "le point tiré est sous la courbe". Sous l'hypothèse que $P(A)$ est proportionnelle à $\mathcal{A}_f$, d'après la loi des grands nombres, la fréquence à laquelle $A$ est réalisé va s'approcher de plus en plus de $\frac{\mathcal{A}_f}{\mathcal{A}_{\text{rectangle}}}$.
from IPython.display import HTML
import numpy as np
from random import *
from pylab import *
from matplotlib import animation
from matplotlib import pyplot as plt
# nombre de tirs
NbPt=500
# caractéristique du graphe
fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(10, 6)) # figure sur deux graphes
ax1.set_xlim(0, 1) # axe abscisses graphe 1
ax1.set_ylim(0,1)
ax2.set_xlim(0, NbPt)
ax2.set_ylim(0,1)
Xautre,Yautre,Xcourbe,Ycourbe=[],[],[],[]
S=0
Pi=[]
P=[1/3 for k in range(NbPt)]
pointCourbe, = ax1.plot([],[],'bx') # go signifie g : green et x: croix ; sur le graphe 1
pointAutre, = ax1.plot([],[],'go') # ro signifie r : red et o: petit cercle
courbe, =ax2.plot([],[])
def init():
X=linspace(0, 1, 60)
Y=[k**2 for k in X]
ax1.plot(X,Y,'r' )
# ax1.add_artist([X,Y])
pointCourbe.set_data([],[])
pointAutre.set_data([],[])
courbe.set_data([],[])
ax2.plot(range(NbPt),P)
return
def cv2(n):
global S
x,y=random(),random()
if y<=x**2:
S=S+1
Xcourbe.append(x)
Ycourbe.append(y)
pointCourbe.set_data([Xcourbe, Ycourbe])
else:
Xautre.append(x)
Yautre.append(y)
pointAutre.set_data([Xautre, Yautre])
Pi.append(S/(n+1))
courbe.set_data(range(n+1),Pi)
return
anim=animation.FuncAnimation(fig,func=cv2 ,frames= NbPt,init_func=init, interval=20, repeat=False)
plt.close()
HTML(anim.to_jshtml())